﻿using Persistance;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MesErreurs;
using MySql.Data.MySqlClient;

namespace Metier
{
    public class Commande
    {
        //Definition des attributs
        private String noCommande;
        private Vendeur noVendeur;
        private Clientel noClient;
        private String dateCommande;
        private String facture;
        //Definition des properties
        public Vendeur NoVendeur
        {
            get { return noVendeur; }
            set { noVendeur = value; }
        }

        public String NoCommande
        {
            get { return noCommande; }
            set { noCommande = value; }
        }

        public Clientel NoClient
        {
            get { return noClient; }
            set { noClient = value; }
        }

        public string DateCommande
        {
            get { return dateCommande; }
            set { dateCommande = value; }
        }

        public String Facture
        {
            get { return facture; }
            set { facture = value; }
        }

        //Constructeurs
        public Commande()
        {
            noCommande = "";
            noVendeur = new Vendeur();
            noClient = new Clientel();
            dateCommande = "";
            facture = "";
        }
        public Commande(string noCo, string date, string fact,Vendeur noVe, Clientel noCli)
        {
            noCommande = noCo;
            noVendeur = noVe;
            noClient = noCli;
            dateCommande = date;
            facture = fact;
        }

        //Traitement de la classe Commande
        /// <summary>
        /// Lire un utilisateur sur son ID
        /// </summary>
        /// <param name="id_utilisateur">N° de l'utilisateur à lire</param>
        public List<String> LectureNoCommande( )
        {
            List<String> mesNumeros = new List<String>();
            DataTable dt;
            sErreurs er = new sErreurs("Erreur sur lecture de la commande.", "Utilisateur.lectureNoCommande()");
            try
            {
                String mysql = "SELECT NO_COMMAND FROM COMMANDES";
                dt = DbInterface.Lecture(mysql, er);
                foreach (DataRow dataRow in dt.Rows)
                {
                    mesNumeros.Add((dataRow[0]).ToString());
                }
                return mesNumeros;
            }
            catch (MySqlException e)
            {
                throw new MonException(er.MessageUtilisateur(), er.MessageApplication(),
                e.Message);
            }
        }

        public Commande RechercheUneCommande(String numCo)
        {
            String mysql;
            DataTable dt;
            sErreurs er = new sErreurs("Erreur sur recherche d'une commande.", "Commande.rechercherCommande()");
            try
            {
                mysql = "SELECT NO_VENDEUR, NO_CLIENT,";
                mysql += "DATE_CDE, FACTURE ";
                mysql += "FROM COMMANDES WHERE NO_COMMAND=:numero";
                // On se protège de l’injection sql
                mysql = mysql.Replace(":numero", numCo);
                // On appelle la couche Persistance
                dt = DbInterface.Lecture(mysql, er);
                if (dt.IsInitialized)
                {
                    DataRow dataRow = dt.Rows[0];
                    this.noCommande = numCo;
                    this.noClient = this.noClient.RechercheUnClient(dataRow[1].ToString());
                    this.noVendeur =  this.noVendeur.RechercheUnVendeur(dataRow[0].ToString());
                    this.dateCommande = dataRow[2].ToString();
                    this.facture = dataRow[3].ToString();
                    return this;
                }
                else return null;
            }
            catch (MySqlException e)
            {
                throw new MonException(er.MessageUtilisateur(), er.MessageApplication(),
                e.Message);
            }
        }
        public List<Commande> getLesCommandes()
        {
            DataTable dt;
            sErreurs er = new sErreurs("Erreur sur recherche d'une commande.", "Commande.getLesCommandes()");
            String mysql = "SELECT * FROM COMMANDES";
            try
            {
                dt = DbInterface.Lecture(mysql, er);
                List<Commande> mesCdes = new List<Commande>();
                foreach (DataRow dataRow in dt.Rows)
                {
                    Vendeur unvd = new Vendeur();
                    unvd.NoVendeur = dataRow[1].ToString();
                    Clientel uncli = new Clientel();
                    uncli.NoClient = dataRow[2].ToString();
                    Commande unecde = new Commande(dataRow[0].ToString(), (dataRow[3].ToString()), dataRow[4].ToString(), unvd, uncli);
                    mesCdes.Add(unecde);
                }
                return mesCdes;
            }
            catch (MonException erreur)
            {
                throw erreur;
            }
        }

        public void insererCommande(string noCom, string noVend, string noCli, string date)
        {
            String requete = "INSERT INTO COMMANDES VALUES (':numCom',':numVend',':numCli',':dateCo',':facture');";
            requete = requete.Replace(":numCom", noCom);
            requete = requete.Replace(":numVend", noVend);
            requete = requete.Replace(":numCli", noCli);
            requete = requete.Replace(":dateCo", date);
            requete = requete.Replace(":facture", "F");

            sErreurs er = new sErreurs("Erreur sur l'insertion de la commande.", "Utilisateur.insererCommande");
            try
            {
                DbInterface.Ecriture(requete,"INSERT");
            }
            catch (MySqlException e)
            {
                throw new MonException(er.MessageUtilisateur(), er.MessageApplication(),
                e.Message);
            }
        }

        public void modifierCommande ()
        {
            String requete = "UPDATE COMMANDES SET NO_VENDEUR=':numVend',NO_CLIENT=':numCli',DATE_CDE=':dateCo',FACTURE=':facture' WHERE NO_COMMAND=':numCom';";
            requete = requete.Replace(":numCom", noCommande);
            requete = requete.Replace(":numVend", noVendeur.NoVendeur);
            requete = requete.Replace(":numCli", noClient.NoClient);
            requete = requete.Replace(":dateCo", dateCommande.ToString());
            requete = requete.Replace(":facture", facture);

            sErreurs er = new sErreurs("Erreur sur la modification de la commande.", "Utilisateur.ModifierCommande");
            try
            {
                DbInterface.Ecriture(requete, "UPDATE");
            }
            catch (MySqlException e)
            {
                throw new MonException(er.MessageUtilisateur(), er.MessageApplication(),
                e.Message);
            }
        }

        public void supprimerCommande()
        {
            String requete = "DELETE FROM COMMANDES WHERE NO_COMMAND=:numCom;";
            requete = requete.Replace(":numCom", noCommande);
            sErreurs er = new sErreurs("Erreur sur la suppression de la commande.", "Utilisateur.supprimerCommande");
            try
            {
                DbInterface.Ecriture(requete,"DELETE");
            }
            catch (MySqlException e)
            {
                throw new MonException(er.MessageUtilisateur(), er.MessageApplication(),
                e.Message);
            }
        }
    }
}
